import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) throws Exception {
        Node root = new Folder();
        root.add(new File(10));
        Node sub = new Folder();
        sub.add(new File(20));
        root.add(sub);

        System.out.println("total size = " + root.size()); // 30
    }

}
// 组合模式（Composite）= “把个体和整体当一样的东西对待”
// 树形结构（文件系统、菜单、组织架构）专用：文件夹 & 文件 都实现同一接口，客户端不用关心当前是叶子还是容器

// 统一组件接口
interface Node {
    int size(); // 文件→字节数；文件夹→递归总大小

    default void add(Node n) {
    } // 叶子无意义，空实现
}

// 文件节点
class File implements Node {
    private int bytes;

    File(int bytes) {
        this.bytes = bytes;
    }

    public int size() {
        return bytes;
    }
}

// 文件夹节点
class Folder implements Node {
    private List<Node> children = new ArrayList<>();
    @Override
    public void add(Node n) {
        children.add(n);
    }

    public int size() {
        return children.stream().mapToInt(Node::size).sum();
    }
}